package com.wlts.wzy.Result;

import lombok.Data;

@Data
public class Result<T> {

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 获取状态。
     *
     * @return 状态
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 状态信息,错误描述.
     */
    private String message;

    /**
     * 获取消息内容。
     *
     * @return 消息
     */
    public String getMessage() {
        return message;
    }

    /**
     * 数据.
     */
    private T data;

    /**
     * 获取数据内容。
     *
     * @return 数据
     */
    public T getData() {
        return data;
    }

    public Result(Integer status, String message, T data) {
        this.code = status;
        this.message = message;
        this.data = data;
    }

    public Result(Integer status, String message) {
        this.code = status;
        this.message = message;
    }

    public Result(int status, String message) {
        this.code = status;
        this.message = message;
    }

    public Result(T t) {
        this.code = Status.OK.getCode();
        this.data=t;
    }

    public Result() {
        this.code = Status.OK.getCode();
    }



    /**
     * 创建一个带有状态、消息和数据的结果对象.
     *
     * @param status  状态
     * @param message 消息内容
     * @param data    数据
     * @return 结构数据
     */
    public static <T> Result<T> buildResult(Status status, String message, T data) {
        return new Result<T>(status.getCode(), message, data);
    }

    /**
     * 创建一个带有状态、消息和数据的结果对象.
     *
     * @param status  状态
     * @param message 消息内容
     * @return 结构数据
     */
    public static <T> Result<T> buildResult(Status status, String message) {
        return new Result<T>(status.getCode(), message);
    }

    /**
     * 创建一个带有状态和数据的结果对象.
     *
     * @param status 状态
     * @param data   数据
     * @return 结构数据
     */
    public static <T> Result<T> buildResult(Status status, T data) {
        return new Result<T>(status.getCode(), status.getReason(), data);
    }

    /**
     * 创建一个带有状态的结果对象.
     *
     * @param status 状态
     * @return 结构数据
     */
    public static <T> Result<T> buildResult(Status status) {
        return new Result<T>(status.getCode(), status.getReason());
    }

    public static <T> Result<T> buildResult(T data) {
        Status status= Status.OK;
        return new Result<T>(status.getCode(), status.getReason(),data);
    }

    /**
     * 创建一个带有状态和数据的结果对象.
     *
     * @param status 状态
     * @param message  信息
     * @return 结构数据
     */
    public static <T> Result<T> buildResult(int status, String message) {
        return new Result<T>(status, message);
    }

    /**
     * 创建一个带有状态和数据的结果对象.
     * @return 结构数据
     */
    public static <T> Result<T> buildResult() {
        return new Result<T>();
    }


    public enum Status {

        /**
         * 状态
         */
        OK(200, "正确"),
        BAD_REQUEST(400, "错误的请求"),
        UNAUTHORIZED(401, "禁止访问"),
        NOT_FOUND(404, "没有可用的数据"),
        PWD_ERROR(300, "密码错误"),
        EXIT(803, "已经存在"),
        INTERNAL_SERVER_ERROR(500, "服务器遇到了一个未曾预料的状况"),
        SERVICE_UNAVAILABLE(503, "服务器当前无法处理请求"),
        ERROR(999, "数据不能为空");
        /**
         * 状态码,长度固定为6位的字符串.
         */
        private Integer code;

        /**
         * 错误信息.
         */
        private String reason;

        Status(Integer code, String reason) {
            this.code = code;
            this.reason = reason;
        }

        public Integer getCode() {
            return code;
        }

        public String getReason() {
            return reason;
        }

        @Override
        public String toString() {
            return code + ": " + reason;
        }

    }
}